package org.zn.note.designpattern;

/**
 * 模板模式（Template Pattern）
 * 一个抽象类公开定义了执行它的方法的方式/模板。
 * 它的子类可以按需要重写方法实现，但调用将以抽象类中定义的方式进行。
 */
public class Pattern24_Template {

    public static void main(String[] args) {
        Game game = new Cricket();
        game.play();
        System.out.println();
        game = new Football();
        game.play();
    }

    private static abstract class Game {
        // 模板，定义为final，不能被重写。也就是这个处理流程是固定的，然后每个步骤可以自己实现
        final void play() {
            initialize(); // 初始化游戏
            startPlay(); // 开始游戏
            endPlay(); // 结束游戏
        }

        abstract void initialize();

        abstract void startPlay();

        abstract void endPlay();
    }

    private static class Cricket extends Game {

        @Override
        void endPlay() {
            System.out.println("Cricket Game Finished!");
        }

        @Override
        void initialize() {
            System.out.println("Cricket Game Initialized! Start playing.");
        }

        @Override
        void startPlay() {
            System.out.println("Cricket Game Started. Enjoy the game!");
        }
    }

    private static class Football extends Game {

        @Override
        void endPlay() {
            System.out.println("Football Game Finished!");
        }

        @Override
        void initialize() {
            System.out.println("Football Game Initialized! Start playing.");
        }

        @Override
        void startPlay() {
            System.out.println("Football Game Started. Enjoy the game!");
        }
    }
}
